DDR の譜面解析
画面周り
緑数字の話から
225000 / bpm = 表示フレーム数 * 10 らしい
→ 22500 / bpm = 表示フレーム数
→ 22500 / 60 / bpm = 表示フレーム数 (フレーム) / 60 (フレーム/秒)
→ 375 / bpm = 表示時間 (秒) = 1画面スクロールにかかる時間 (秒/画面)
たとえば bpm150 なら 375/150 = 2.5 秒
→ DROP THE BOMB 等速 (bpm150) での検証結果と一致する
ちなみに
スクロール速度 (画面/秒)
= 1 / 表示時間 (秒)
たとえば bpm150 なら 1 / (375/150) = 0.4 (画面/秒)
1画面の表示範囲 (ビート/画面)
= 1画面スクロールにかかる時間 (秒/画面) * 1秒あたりビート数 (ビート/秒)
= (375 / bpm) * (bpm / 60)
= 375 / 240
= 等倍なら、 bpm にかかわらず 1.5625 小節
前処理:停止時間の補正
dwi、sm とも停止時間は拍数ではなく秒数指定
→ 精度に限度があるので、基本的に全てちょっとずれている
拍数なら「12分1個分」のように厳密に表現できるはずなので、そうしたい
(ズレたままだと、リズム難度の分析等で困る)
純粋に停止の長さをクォンタイズする案
今採用しているもの。
仮定:「64分5個分」みたいなイカれた停止は、存在しない (意図したものではない)
現状のアルゴリズム
12分、または16分にクォンタイズする
最小公倍数だと36分になるが、それは避ける
両方試して、より元の秒数に近かった方を採用
クォンタイズ誤差が特定の値 (2f@60fps=マベの広さ、くらい?) を超えていたら、24分または32分にフォールバック
課題
フォールバックすると意図しない誤差が許容されてしまう場合がある?
参考:bpm180の1拍は20f@60fps → 32分はその1/8なので、2.5f
でもフォールバックを許容しないとANTI-ANTHEMみたいなやつを表現できないジレンマ
フォールバック時、 32 分と 24 分が極めて近接してる場合に、間違った方に解釈される場合がある?
周辺のノートや停止に 16 分系が多いか 12 分系が多いかでヒューリスティイックみたいな方法もある?
CHAOS、FaXXのように途中から矢印が全部緑になるやつはうまく処理できない
意図的に変な長さの停止が含まれているため
8分1拍+64分1拍、みたいな
→ 現状は、特殊なケースは手打ちハードコーディングで対応している
「次の矢印までの時間」をクォンタイズする案
仮定:停止直後の矢印は、せいぜい12分か16分まで
期待
CHAOSみたいな「意図的な変な停止」もおそらくちゃんと処理できる
それ以外のクォンタイズミスも減ると思われる
クォンタイズをミスる=以降の矢印のタイミングがズレる
逆に、矢印のタイミングが正確なら、そのクォンタイズは正しかったという仮説
課題
ある矢印と別の矢印の間に、二つ以上停止が挟まる場合をどう扱うか
踊と激でクォンタイズの結果が変わる、みたいなケースを生じないか
Ace for aces のように、譜面ごとで意図的に停止が異なっているケースもあるのが難しい
前処理:譜面の標準化
停止やBPM倍取りなどの、「見た目だけ」のギミックを除去したい (1.2倍など曲の意図に沿ったソフランは残す)
目的
リズム難度の解析がしやすくなる
たとえばBPM倍取り譜面は、表面上「4分だらけ」になるのでめっちゃ素直なリズムに見えてしまう
普通にユーザーにとって有益な情報にもなる
たとえば停止のせいでNOTEの色がズレる譜面など
標準化すれば、「停止がなかった場合の、本来の色」が求まる
方針
停止
その停止の長さ分の、空白に置き換える
BPM変化
BPMが100〜199.9(9)の範囲に収まるように、2^k倍する
たとえばbpm360は180とみなす
同様にbpm90も180とみなす
→ 本質的なbpm変化 (180から160、など) 以外のbpm変化が消滅する
課題
停止の長さが正しくクォンタイズされている必要がある
つまり ↑ の下処理がうまく行っている前提となる
単純にメチャクチャ遅い曲 (bpm90未満) が変な感じになる
リズムの複雑さ評価
リズムを難しくする要素
ズレ、シャッフル
見慣れない間の空き方をしたリズム
裏で入って裏で着地する4分とか
シーケンスの出現位置も大事そう
タタンタ と ウンタタンタ は後者のがむずげ
🟥🟨・🟨 と・・ 🟦🟨・🟨
1ビート中の話なのか1小節中の話なのか?
「裏の方が難しい」をどう表現するか
「裏に行って帰ってくる」みたいな捉え方もありかもしれない?
なかなか帰ってこない方が難しい
一応、裏に行くリズムがある譜面とない譜面では、不均一さ(↓)が自然と変わるので、そこで捉えられれば良いが…
間が空いたり不均一だと難しい傾向がありそう
🟥🟨🟦🟨🟥 より 🟥🟨・🟨🟥 の方が難しそう (だから空打ちしたくなる)
統計的な手法案
ノートとノートの間の距離(時間)の分散を見る
なしではないが…
l'amourやxenonのような、「裏で入るからこそ難しい」やつが反映されづらい
外れ値のインパクトでかそう問題
分散している=一箇所に集中していない
最多の項目の度数が(全体に対して)少ないほど複雑説
これもわりとありそうだった
が、l'amour系の難しさが反映されづらいのはそう
2-gram、3-gramにしてヒストグラムを取る、みたいのもアリ
ただなんか、パッとしない結果になった
単純に黄色・緑矢印を数える
わりとアリだった
ただし、倍取り系の譜面は過小評価される
CHAOSのような、ほとんど黄色の譜面が壊れる
→ 「譜面の標準化」の精度が上がればうまく行くかも
じわっと加速するようなキモソフランをどう評価するかが課題?
踏み方解析
基本方針
(今何コンボ目か, 左足の乗っているパネル, 右足の乗っているパネル, 前回使った足が右or左or両方) を状態とした動的計画法でいける?
同時押しとかもあるので「前回使った足=両方」というケースもありそう
↑前回右/左足を使った時刻、もあった方が良さそう
移動距離の長い動きの難易度はそこに依存するので
状態に含めるとさすがに爆発するので、コストの算出だけに使うのが良さそう
2つの足の組み合わせ(左=↑、右=← みたいな)は 4x3 = 12 通りしかない
→ 状態「n コンボまで踏んで姿勢が x」は全部で 12n 通りしかない
「前回使った足が左 or 右 or 両方」を加味してもその3倍 36n しかない
コンボ数が高々 1000 とすると、計 36000 通りしか状態がないので十分いけそう
n コンボ目から n+1 コンボ目に遷移する時のコストを「踏む大変さ」にして、最短経路出すみたいなイメージ
踏む大変さ:
捻り・逆足入り+1
スイッチ+1
縦連+2
270捻り+2
スライド+2
回転+♾️
みたいな
プレイヤーの得意不得意で調整できるようにしても面白そう
ステップの速さも加味したほうがいいかも?
たとえば、「8分スイッチ」を入れることで後の「16分捻り」を避けられるならスイッチが有力
最初の2歩でいきなり2通りに絞れるな(順入りか逆入りのどちらか)
スライドせざるを得ない場合にどこでスライドすべきかは、譜面の速さとか配置によるのでちょっと検討が必要そう
たとえば超高速で←から→にスライドする、とかはあり得ない踏み方
これも猶予時間と移動距離とかで数値化はできるかもしれない
ゆっくりの定義が曲によってまちまちに感じるのが難しいところか
「この曲でスライドするならここ」みたいな感じで相対的なものだとおもわれる
最適 OP (LEFT/RIGHT とか) も割り出せそう
Mac のメモからのサルベージ
270度と90度は足の配置だけでは区別がつかない
→↓← (左↓右←) … 90 度、左向き、右足が前
→↑←↓ (左↓右←) … 270 度、右向き、左足が前
なので PlayerState をもう一次元増やす必要があるかも?
手前のステップみて判定できる?
たとえば ↓← の順なら必ず 90 度捻りと言える?
言えるかもしれない?
全通り検証したら言えそうなので後ほど
地団駄
「ベースの速さ」を見つけたい
「それより速い箇所」も含めて滝の長さをカウント
たとえば 16 分なら 16 分と 24 分の両方をカウント
「一定の長さ以上(たとえば6連以上、ノート数の2%以上、とか)の滝のうち、一番速いもの」がベースの滝の長さ?
例:
24分以上 MAX3連
16分以上 MAX10連
8分以上 MAX26連
4分以上 MAX80連
2分以上 MAX300連
1分以上 MAX500連
0.5分以上 MAX500連
みたいな感じなら、滝のベースは 16 分で、間に3連のドゥルが混ざっているような譜面?
逆に一番隙間の空いているところは 1 分で、踏み替えるとしたら1分 〜 2分くらいのところで踏み替えるのが適切そう
みたいな
スイッチ
「両足が同じパネルに乗っている」と見倣わす良い感じになるかも?
ロングノートでスイッチのパターン (wadats) も?
空踏みに対応しつつ、「左右のスライドは超厳しい」というヒューリスティックを入れればよさそう?
ショック
銀パネを片足で踏むパターン、両足で踏むパターン、大ジャンプでなんとかするパターンがあって意外とややこしい?
後者2つは (後続のステップへの影響という意味では) ほとんど同じと見てもいいかもしれないけど